package cn.hp.crm.servlet.user;

import cn.hp.crm.model.User;
import cn.hp.crm.service.UserService;
import cn.hp.crm.service.impl.UserServiceImpl;
import cn.hp.crm.util.JsonForServlet;
import cn.hp.crm.util.PageBean;
import cn.hp.crm.util.ResultData;
import cn.hutool.core.util.StrUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

// 汇总user的全部servlet请求
@WebServlet("/user/user.do")
@MultipartConfig  // 开启本servlet中的部分功能，可以接收文件的功能
public class UserAllServlet extends HttpServlet {

    private UserService userService = new UserServiceImpl();

//    每一个请求都要访问此方法，所以在这个方法中进行分发请求
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        获取请求中携带的参数
        String service = req.getParameter("service");  // add  delete reset list
//        一劳永逸的办法，下面新增方法，上不需要在添加；
//        找到一个可以知道当前类中所有的方法的办法      类  Class( 所有类的类 ) 描述类中所包含的内容 ( 包名 类名 父类 属性 方法 ... )
        try {
//            方法的调用 ： 对象  参数   servlet对象 系统自动创建，  this：当前执行此方法的对象
            try {
                UserAllServlet.class.getDeclaredMethod(service, HttpServletRequest.class, HttpServletResponse.class).invoke(this,req,resp);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

//        switch (service){
//            case "add":
//                add(req,resp);
//                break;
//            case "delete":
//                delete(req,resp);
//                break;
//        }
    }

//    获取当前用户的头像地址
    public void userImg(HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException{
//        当前登录的用户
        String user = (String) request.getSession().getAttribute("user");
        ResultData resultData = userService.selectImg(user);
        JsonForServlet.transferData(response, resultData);
    }

//    修改头像的后端
    public void updateImg(HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException{
//        修改头像步骤：1、获取上传的头像文件， 2、将文件保存在服务器中(本机中，1.项目中 2.硬盘中)， 3、将图片地址与用户绑定保存在数据库
//        String userImg = request.getParameter("userImg"); // 上传的是图片无法使用字符串获取
        Part part = request.getPart("userImg");  // 如果想要使用，必须开启部分配置
//        Multipart
//        System.out.println(part.getSubmittedFileName());
        String userImgPath = request.getServletContext().getRealPath("userImg"); // 项目运行路径下的userImg地址
//        System.out.println(userImgPath);
        File file = new File(userImgPath); // 使用userImg路径创建一个文件
//        判断此文件夹是否存在
        if (!file.exists()  || !file.isDirectory() ){
            file.mkdirs(); // 如果不存在，或者不是一个文件夹 则创建
        }
//        String realPath = userImgPath + File.separator + part.getSubmittedFileName();  // xx/xx  /  xx.jpg
//        part.write(realPath); //将图片写入某一个路径中  xx/xx/xx.jpg
//        导致服务器中的空间压力过大， 一个人可以上传到服务器中无数张照片   使上传者的文件名称保持一致，  userName来进行文件命名
        String user = (String) request.getSession().getAttribute("user");  // username  ==  xxx   .jpg
//        从上传的文件中，截取文件类型
        ; //  xxx.jpg 中 .的下标位置
        String suffix = part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf("."));
        String realPath = userImgPath + File.separator + user + suffix ;  // 拼接成新的文件路径名
        part.write(realPath);  // D:\workspace\crms\out\artifacts\crms_war_exploded\   http://loaclhost:8080/   /userImg/1.jpg
//        用户和图片进行绑定
        ResultData resultData = userService.updateImg(user, "/userImg/"+user+suffix);
        JsonForServlet.transferData(response,resultData);
    }


//     控制修改头像的页面跳转
    public void updateImgPage(HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException{
        request.getRequestDispatcher("/WEB-INF/user/updateImg.html").forward(request,response);
    }

//    修改密码业务
    protected void updatePassword(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String password = request.getParameter("password");
        String newPassword = request.getParameter("newPassword");
        String userName = (String) request.getSession().getAttribute("user");
//        获取到新旧密码之后，修改  需要当前登录的用户
        ResultData resultData = userService.updatePassword(userName , password , newPassword);
        JsonForServlet.transferData(response,resultData);
    }


//    跳转到修改密码页面
    protected void updatePwd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/WEB-INF/user/updatePwd.html").forward(request,response);
    }

//    退出用户方法
    protected void loginOut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        获取当前登录的user用户，然后情况session中的数据
        request.getSession().invalidate();
        response.sendRedirect("/login.html"); // 重定向到登录页面
    }

    //  编写重置密码的内容  servlet层做的判断是用来返回数据和要跳转的页面
    protected void reset(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        获取请求中的id参数
        Integer id = Integer.parseInt(request.getParameter("id"));
//      调取service层修改密码 获取结果，让service层判断数据的正确与否
        ResultData resultData = userService.resetPassword(id);
        JsonForServlet.transferData(response,resultData);
    }

//      获取分页user数据
    protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        获取全部的用户数据
//        List<User> users = userService.getAllUsers();
//        System.out.println(users);
//        通过分页获取数据
//        System.out.println("parameters:" + req.getParameter("page") + req.getParameter("limit"));

//        修改此方法添加条件查询
//        System.out.println(req.getParameter("userName") + req.getParameter("realName")+req.getParameter("type"));
//        使用user保存条件查询的条件
        User user = new User();
        user.setUserName(req.getParameter("userName"));
        user.setRealName(req.getParameter("realName"));
        if (!StrUtil.isEmpty(req.getParameter("type"))){
            user.setType(Integer.parseInt(req.getParameter("type")));
        }
//        设置到分页的参数中
        PageBean pageBean = new PageBean() ;
        pageBean.setCurrentPage(  Integer.parseInt(req.getParameter("page")));
        pageBean.setDataVolumePerPage(  Integer.parseInt(req.getParameter("limit")));
//        获取分页数据
        PageBean pb = userService.getUsersByPage(pageBean,user);
//        System.out.println(pb.getTotalNumber());
//        System.out.println(pb);
//        将分页后的数据传输给页面
        JsonForServlet.transferData(resp,ResultData.getSuccessData("",pb));

    }

//    用户删除方法   数据类型... 参数名  可变参数，只能放在定义方法时的最后一位
    public void delete(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//        获取全部要删除的id
        String ids = req.getParameter("ids");
        String[] split = ids.split("&");
//        System.out.println(Arrays.toString(split));
        ResultData resultData = userService.delUsers(split);
        JsonForServlet.transferData(res,resultData);
    }

//  用户新增方法
    public void add(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

//        获取页面传递参数
        String userName = req.getParameter("userName");
        String password = req.getParameter("password");
        String realName = req.getParameter("realName");
        int type = Integer.parseInt(req.getParameter("type"));

        User parameter = new User(userName,password,realName,type);

//        调用service层方法，新增一个用户
        ResultData resultData = userService.addUser(parameter);
//        System.out.println(userName + "," + password + "," + realName + "," + type);
        JsonForServlet.transferData(res, resultData);
    }
}
